﻿''' <summary>
''' Allows you to draw and play with timelimits
''' </summary>
''' <remarks></remarks>
Public Class Timer
    Dim Font As Integer = 1
    Enum Timemodus
        Single_Countdown
        Multi_Countdown
        Campaign_Counter
    End Enum
    Dim TimeMode As Timemodus = Timemodus.Multi_Countdown
    Dim Time As Long
    Public Sub Settime(ByVal Time As Long)
        Me.Time = Time
    End Sub
    Dim Maxtime As Long
    Public Function GetMaxTime() As Long
        Return Maxtime
    End Function
    Dim LastUpdate As Long
    Dim Break As Boolean = False
    Public Flip As Boolean = True
    Dim T As ObjektText
    Dim AniBreak As Boolean = False
    Public Sub New(ByVal Hours As Integer, ByVal Minutes As Integer, ByVal Seconds As Integer, ByVal Timemode As Timemodus)
        Me.Maxtime = Hours * TimeSpan.TicksPerHour + Minutes * TimeSpan.TicksPerMinute + Seconds * TimeSpan.TicksPerSecond
        Me.TimeMode = Timemode
        Break = True
    End Sub
    Public Sub New(ByVal Maxtime As Long, ByVal Timemode As Timemodus)
        Me.Maxtime = Maxtime
        Me.TimeMode = Timemode
        Break = True
    End Sub
    Public Sub Timer_Start()
        Select Case TimeMode
            Case Timemodus.Single_Countdown

            Case Timemodus.Multi_Countdown
                Me.Time = 0
        End Select
        Break = False
        LastUpdate = Now.Ticks
    End Sub
    Public Sub Timer_Pause()
        If Break Then
            Break = False
            LastUpdate = Now.Ticks
        Else
            Break = True
        End If
    End Sub
    Public Sub Timer_Stop()
        Time = 0
        Break = True
    End Sub
    Public Sub Timer_Update()
        Select Case Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe
            Case ObjektSpieler.KIStufen.Geschlossen, ObjektSpieler.KIStufen.Offen, ObjektSpieler.KIStufen.Passiv
                Exit Sub 'During Network Games those Player have no right to 
        End Select
        'Events that stop the timer to count
        Select Case TimeMode
            Case Timemodus.Multi_Countdown, Timemodus.Single_Countdown
                If Not Objektverwalter.Spielfeld Is Nothing Then
                    If Objektverwalter.Spielfeld.Animationen.Length > 0 Then 'Animations? No Countdown!
                        AniBreak = True
                        Exit Sub
                    ElseIf Not Objektverwalter.Spielfeld.Angriff Is Nothing Then 'Battle? No Countdown!
                        AniBreak = True
                        Exit Sub
                    ElseIf ObjektKODialog.AktuellerDialog IsNot Nothing Then
                        AniBreak = True
                        Exit Sub
                    ElseIf Objektverwalter.Spielfeld.Laufen IsNot Nothing Then
                        If Not Objektverwalter.Spielfeld.Laufen.Zielerreicht Then
                            AniBreak = True
                            Exit Sub
                        End If
                    End If
                End If
        End Select
        If AniBreak = True Then
            AniBreak = False
            LastUpdate = Now.Ticks
        End If
        If Not Objektverwalter.Spielfeld.Regeln.Spielende Then
            If Not Timer_Time_Up() And Not Break And Maxtime > 0 Then
                Dim momTime As Long = Now.Ticks
                Time += (momTime - LastUpdate)
                LastUpdate = momTime
                Hauptmenue.NetzBefehlSenden("Update|Timer|" + Time.ToString + "|" + Objektverwalter.Spielfeld.AktuellerSpieler.Spieler.ToString)
            End If
        End If
    End Sub
    Public Function Timer_Time_Up() As Boolean
        If Break Then Return False
        If Maxtime <= 0 Then Return False
        If Time > Maxtime Then
            Time = Maxtime
            Return True
        End If
        If Time = Maxtime Then Return True
        Return False
    End Function
    Public Sub Draw()
        If Not Hauptmenue.AufzeichnungAbspielen Then
            If T Is Nothing Then
                T = New ObjektText(New String() {}, 10, 10, Nothing, Schriftengine.Schriftarten.Courier_New, 12, FontStyle.Regular)
            End If
            If Maxtime > 0 Then
                Dim TimeSpa As TimeSpan
                Select Case TimeMode
                    Case Timemodus.Multi_Countdown, Timemodus.Single_Countdown
                        TimeSpa = TimeSpan.FromTicks(Maxtime - Time)
                    Case Else
                        TimeSpa = TimeSpan.FromTicks(Time)
                End Select
                Dim H As Integer = TimeSpa.Hours + 24 * TimeSpa.Days
                Dim Min As Integer = TimeSpa.Minutes
                Dim Sec As Integer = TimeSpa.Seconds
                Dim Text As String = H.ToString
                If H > 0 Then
                    Text += ":"
                Else
                    Text = ""
                End If
                If Min > 9 Then
                    Text += Min.ToString
                Else
                    Text += "0" + Min.ToString
                End If
                Text += ":"
                If Sec > 9 Then
                    Text += Sec.ToString
                Else
                    Text += "0" + Sec.ToString
                End If
                Dim Fontwidth As Integer = T.GetSchriftart.MeasureString(Schriftengine.MeasureSprite, Text, Microsoft.DirectX.Direct3D.DrawTextFormat.None, Color.Black).Width
                If Flip Then
                    T.neuerText(New String() {Text}, DataSettings.BildschirmBreite - Fontwidth - 10, 10, Nothing)
                Else
                    T.neuerText(New String() {Text}, 10, 10, Nothing)
                End If
                T.Malen(New Point)
            End If
        End If
    End Sub
    Public Sub End_Turn_Or_Game()
        Objektverwalter.Spielfeld.EingabenErlauben = False
        Select Case TimeMode
            Case Timemodus.Multi_Countdown 'end turn
                Timer_Endturn()
            Case Timemodus.Single_Countdown
                Objektverwalter.Spielfeld.Regeln.Besiegt(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) = True 'Looses
                Objektverwalter.Spielfeld.Regeln.CheckSieg()
                If Not Objektverwalter.Spielfeld.Regeln.Spielende Then
                    Timer_Endturn()
                End If
            Case Timemodus.Campaign_Counter 'End_Game

        End Select
    End Sub
    Public Sub Write(ByRef StrW As Filestream)
        Dim B(7) As Byte
        StrW.WriteByte(TimeMode)
        B = LongToBytes(Time)
        For I = 0 To B.Length - 1
            StrW.WriteByte(B(I))
        Next
        B = LongToBytes(Maxtime)
        For I = 0 To B.Length - 1
            StrW.WriteByte(B(I))
        Next
    End Sub
    Private Sub Timer_Endturn()
        While CType(Objektverwalter.Menue, ObjektSpielMenue).Spielmodus <> ObjektSpielMenue.Spielmodi.Nichts
            Select Case CType(Objektverwalter.Menue, ObjektSpielMenue).Spielmodus
                Case ObjektSpielMenue.Spielmodi.Einheitausgewaehlt
                    If Objektverwalter.Spielfeld.AktuelleEinheit IsNot Nothing Then
                        Objektverwalter.Einheitabwaehlen(True)
                    End If
                    Objektverwalter.Spielfeld.Laufen = Nothing
                    Objektverwalter.Spielfeld.LaufenLoeschen = False
                Case ObjektSpielMenue.Spielmodi.KOInfoAnzeige
                    Objektverwalter.Spielfeld.KOInfos.InfoBeenden()
                Case ObjektSpielMenue.Spielmodi.KOSprechen
                    Array.Resize(ObjektKODialog.KOTextVorrat, 0)
                    ObjektKODialog.AktuellerDialog.Loeschen()
                Case Else
                    CType(Objektverwalter.Menue, ObjektSpielMenue).DeleteAction(-1, -1, True)
            End Select
        End While
        If Objektverwalter.Spielfeld.CurrentAI IsNot Nothing Then
            If Objektverwalter.Spielfeld.CurrentAI.KIThreat IsNot Nothing Then
                Objektverwalter.Spielfeld.CurrentAI.KIThreat.Abort()
                Objektverwalter.Spielfeld.CurrentAI.KIThreat = Nothing
            End If
            Objektverwalter.Spielfeld.CurrentAI = Nothing
        End If
        Objektverwalter.MarkierteFelder.Clear()

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            Befehl.Befehl = ObjektKI.KIModiExtern.RundenEnde
            Befehl.KooX = -1
            Befehl.KooY = -1
            Befehl.WegX = New Integer() {-1}
            Befehl.WegY = New Integer() {-1}
            Befehl.OpferX = -1
            Befehl.OpferY = -1
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If

        Objektverwalter.Spielfeld.RundenEnde()
        Hauptmenue.CursorPlazieren(Objektverwalter.Spielfeld.AktuelleEinheitPosition.X * Hauptmenue.Feldbreite, Objektverwalter.Spielfeld.AktuelleEinheitPosition.Y * Hauptmenue.Feldbreite)
    End Sub
    Public Sub Read(ByRef StrR As Filestream)
        Dim B(7) As Byte
        TimeMode = StrR.ReadByte
        For I = 0 To B.Length - 1
            B(I) = StrR.ReadByte
        Next
        Time = BytesToLong(B)
        For I = 0 To B.Length - 1
            B(I) = StrR.ReadByte
        Next
        Maxtime = BytesToLong(B)
        Break = True
    End Sub
End Class
